# 进程里面可以创建多个线程,多进程也可以完成多任务
# 就绪状态: 运行的条件已经马努，等待CPU执行
# 执行状态: CPU正在执行其功能
# 等待(阻塞)状态: 等待某些条件满足，如一个程序sleep了，此时就处于等待状态
# from time import sleep

# print("Leslie")  # 程序开始,执行状态
# st = input("input something")  # 等待状态
# print(st)
# sleep(1)  # 等待状态
# print("hello")  # 程序结束,执行状态

# 进程语法结构
# multiprocessing 模块提供了 Process 类代表进程对象
# Process 类参数
# - target: 执行的目标任务名,也就是子进程要执行的任务
# - args: 以元组的方式给执行任务传参
# - kwargs: 以字典的方式给执行任务传参

# Process 方法
# - start(): 让进程执行任务,子进程开始执行
# - is_alive: 判断子进程是否还存活
# - join(): 主进程等待子进程执行结束

# Process 属性
# - name: 进程名,默认是Process-1,Process-2,....
# - pid: 进程号,每个进程都有一个唯一的进程号,可以通过pid来区分不同的进程
from multiprocessing import Process
import os


def sing():
    print("-------------------- sing --------------------------")
    print(f"get Parent pid is {os.getppid()}")  # 父进程的 pid就是py文件主进程的id
    print(f"sing process pid is {os.getpid()}")
    print("唱歌")


def dance():
    print("-------------------- dance --------------------------")
    print(f"get Parent pid is {os.getppid()}")
    print(f"dance process pid is {os.getpid()}")
    print("跳舞")


if __name__ == "__main__":
    # 创建子进程
    sing_process = Process(target=sing, name="sing_process")
    dance_process = Process(target=dance, name="dance_process")
    # 启动进程
    sing_process.start()
    dance_process.start()
    # 访问属性
    print("-------------------- 访问属性 --------------------------")
    print(sing_process.name)
    print(sing_process.pid)
    print(dance_process.name)
    print(dance_process.pid)

    print(f"主进程的pid是{os.getpid()}")
    print(f"主进程的父进程pid是{os.getppid()}")  # pycharm的进程
